\documentclass[a4paper,10pt]{report}\input{../0.Préambule/Préambule_cours_prof}\input{0_Préambule_Données}\begin{document}

\newpage
\setcounter{chapter}{11}
\chapter{Les tableaux à 2 dimensions en Python}

\section{Comment représenter un tableau en Python}

Un tableau à double entrée (ou tableau à deux dimensions) n'est pas un type de données reconnu nativement par Python. Nous allons utiliser des listes pour le représenter et pour le manipuler.

\medskip
Voici un exemple de tableau :

\begin{center}
\begin{tabular}{|c|c|c|}
\hline
 \hspace{5mm} Nom \hspace{5mm} & \hspace{5mm} Prénom \hspace{5mm} & \hspace{5mm} Âge \hspace{5mm} \\\hline
Dulac&Viviane&17\\\hline
Enchanteur&Merlin&16\\\hline
Lafée&Morgane&16\\\hline
Pendragon&Arthur&18\\\hline
Dulion&Yvain&17\\\hline
\end{tabular}
\end{center}

Chaque ligne du tableau va correspondre à une liste en Python, le tableau consistant donc en une liste de listes.

\begin{center}
\begin{minipage}{7cm}
\begin{edupython}
tableau=[['Nom', 'Prenom','Age'],
        ['Dulac', 'Viviane','17'],
        ['Enchanteur', 'Merlin','16'],
        ['Lafee', 'Morgane','16'],
        ['Pendragon', 'Arthur','18'],
        ['Dulion', 'Yvain','17']]
\end{edupython}
\end{minipage}
\end{center}

On obtient donc une liste de la forme \edupythoninline{tableau = [ligne1, ligne2, ligne3,...]}, chaque ligne étant elle-même une liste.

\medskip
Pour accéder à la $3^e$ ligne du tableau, il faut donc écrire : \edupythoninline{tableau[2]}.

\medskip
Pour accéder au deuxième élément de la 3ème ligne (Merlin), on écrira donc : \edupythoninline{tableau[2][1]}.

\section{Les opérations sur les tableaux}

Comme le tableau est une liste, on peut facilement lui ajouter une ligne avec la méthode .append déjà rencontrée.

\medskip
\noindent Par exemple pour rajouter Debretagne Guenièvre, qui a 16 ans, à la fin de mon tableau, j'utilise la syntaxe suivante : \edupythoninline{tableau.append(['Debretagne','Guenievre','16'])}.

\medskip
\noindent La hauteur du tableau (ici $7$) étant la taille de la liste principale, on peut connaître sa valeur en utilisant : \edupythoninline{len(tableau)}.

\medskip
\noindent La largeur du tableau (ici $3$), constante cette année, est la taille de n'importe quelle ligne, donc on la trouve grâce à : \edupythoninline{len(tableau[0])}.

\noindent \begin{minipage}{8.5cm}
Ces deux informations vont nous permettre de parcourir les tableaux à deux dimensions à l'aide de deux boucles for imbriquées l'une dans l'autre. La syntaxe est la suivante (tableau étant le tableau précédent) :

\medskip
Le parcours du tableau se fait alors ligne par ligne.
\end{minipage}
\hspace{10mm}
\begin{minipage}{6.5cm}
\begin{edupython}
hauteur = ..............
largeur = ..............
for i in range(hauteur):
	for j in range(largeur):
		print(tableau[i][j])
\end{edupython}
\end{minipage}

\section{Exemple d'application : les images}

La plupart des formats d'image sont dit matriciels, c'est à dire que l'image est simplement un tableau à deux dimensions dont chaque case contient la couleur d'un pixel de l'image. Pour récupérer ce tableau et manipuler les images de manière générale nous allons utiliser la bibliothèque PIL (Python Image Library), ou plus particulièrement un fork récent du nom de Pillow (pour Python 3).

\medskip
La première ligne de votre éditeur devra être : \edupythoninline{from PIL import Image}

Cela permet d'importer de nouvelles commandes. Les plus importantes sont :
\begin{enumerate}
\item[•] \edupythoninline{image1 = Image.open(}chemin de l'image\edupythoninline{)} : ouvre une image est la stocke dans la variable image1.
\item[•] \edupythoninline{largeur, hauteur = image1.size} : permet de récupérer les dimensions de l'image.
\item[•] \edupythoninline{image1.getpixel((i,j))} : permet de récupérer un triplet (rouge,vert,bleu) contenant les valeurs RGB du pixel colonne $i$ et ligne $j$.
\item[•] \edupythoninline{image1.putpixel((i,j),(r,g,b))} : permet d'écrire la couleur du pixel colonne $i$ et ligne $j$.
\item[•] \edupythoninline{image1.show()} : permet d'afficher l'image avec un logiciel externe.
\item[•] \edupythoninline{image1.save(}chemin de l'image\edupythoninline{)} : permet de sauvegarder l'image.
\end{enumerate}

\medskip
Il y a beaucoup d'autres commandes à découvrir pour les plus curieux mais celles-ci sont suffisantes pour la majorité des manipulations nécessaires.

\begin{rmq}
Pour que cela fonctionne correctement avec pyzo, il est plus simple de faire en sorte que l'image soit enregistrée dans le même répertoire que votre script. Il faut alors utiliser la commande Exécuter le fichier comme script du menu exécuter (ctrl + shift + E).
\end{rmq}

\begin{ex}
Ouverture du fichier Fleur.jpg

\vspace{-1cm}
\begin{flushright}
\begin{minipage}{6.5cm}
\begin{edupython}
from PIL import Image
image1 = Image.open('Fleur.jpg')
largeur,hauteur = image1.size
print(largeur,hauteur)
image1.show()
\end{edupython}
\end{minipage}
\end{flushright}

\vspace{-1.5cm}
\noindent Modifions le programme précédent pour récupérer la couleur \\ des pixels puis inverser la composante rouge avec la bleue :

\begin{center}
\begin{minipage}{10cm}
\begin{edupython}
from PIL import Image
def inversionRB(img):
	image1 = Image.open(img)
	largeur,hauteur = image1.size
	for i in range(largeur):
		for j in range(hauteur):
			(r,g,b) = image1.getpixel((i,j))
			#inversion des composantes
			................................
	image1.show()
\end{edupython}
\end{minipage}
\end{center}
\end{ex}

\begin{exer1}
A partir des exemples ci-dessus :
\begin{enumerate}[font=\color{exer1}]
\item Créer maintenant une fonction permettant d'afficher la fleur en vert.
\item Créer une fonction permettant d'afficher une image en niveaux de gris (dans un premier temps on prendra pour chaque pixel la moyenne de ses composantes RGB. Par exemple un pixel $(110, 120, 190)$ deviendra $(140, 140, 140)$. On pourra améliorer la conversion dans un second temps).
\item Créer une fonction permettant d'afficher l'image en négatif. C'est à dire que les composantes de chaque pixel sont remplacées par leur complément à 255 : $(110, 125, 207) \longrightarrow (145, 130, 48)$.
\item Autre chose ! (découper une image, faire un négatif de gris, appliquer un filtre à une composante, faire une symétrie, ...). Soyez créatifs !
\end{enumerate}
\end{exer1}

\section{Exemple d'application : les fichiers CSV}

Voir l'activité \href{https://www.axelnax.fr/contenu/02.%20Premi%C3%A8re%20g%C3%A9n%C3%A9rale/04.%20Sp%C3%A9cialit%C3%A9%20NSI/03.%20Activit%C3%A9s/14.%20Tri%20de%20tableaux/A_Fichiers_CSV.pdf}{Fichiers CSV}

\end{document}